package demo01_hello_world;

import com.rabbitmq.client.BuiltinExchangeType;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;

import java.io.IOException;
import java.util.Date;
import java.util.concurrent.TimeoutException;

/**
 * @Description 消息生产者
 * @Author shihan
 * @Date 2020/12/19 17:08
 * @Version 1.0
 */
public class SimpleProducer {

    public static void main(String[] args) throws IOException, TimeoutException {
        // 第一步：基础的连接配置信息
        // 创建连接工厂
        ConnectionFactory connectionFactory = new ConnectionFactory();
        // 设置 RabbitMQ 服务器的 IP 地址
        connectionFactory.setHost("192.168.66.129");
        // 设置虚拟主机名称     PS：/ 在 URL 地址中的转译字符为 %2f
        connectionFactory.setVirtualHost("/");
        // 设置连接 RabbitMQ 的用户名
        connectionFactory.setUsername("root");
        // 设置连接 RabbitMQ 的密码
        connectionFactory.setPassword("123456");
        // 设置 RabbitMQ 通信的端口号
        connectionFactory.setPort(5672);

        // 第二步：创建实际进行通信的对象
        // 通过 ConnectionFactory 获取到 Connection 对象
        Connection connection = connectionFactory.newConnection();
        // 通过 Connection 获取到 Channel 对象
        Channel channel = connection.createChannel();

        String queueName = "queue.qname";
        String exchangeName = "exc.ename";
        // 创建 Queue 队列
        /**
         * 队列名称
         * 是否持久化：RabbitMQ 服务器重启之后，该队列是否被删除
         * 是否排他：只允许当前线程操作队列，其他线程无法操作队列（后续深入理解）
         * 是否自动删除：当没有消费者监听时，该队列是否被删除（后续深入理解）
         * 其他参数
         */
        channel.queueDeclare(queueName,false,false,true,null);

        // 创建 Exchange 交换器
        /**
         * 交换器名称
         * 交换器类型
         * 是否持久化
         * 是否自动删除
         * 其他参数
         */
        channel.exchangeDeclare(exchangeName, BuiltinExchangeType.DIRECT,false,false,null);

        // 第三步：绑定 Exchange 和 Queue
        /**
         * queueBind：将交换器和Queue绑定
         * exchangeBind：将交换器和其他交换器绑定
         */
        channel.queueBind(queueName,exchangeName,"hello.world");

        // 第四步：发送消息，指定交换器、路由键
        channel.basicPublish(exchangeName,"hello.world",null,("Simple hello world msg to MQ! " + new Date().toString()).getBytes());

        // 第五步：关闭连接资源
        channel.close();
        connection.close();

    }

}
